/*
 * ### 面试题：判断一个字符串是否为回文
 **题目描述：** 编写一个函数 `isPalindrome`，该函数接收一个字符串 `str` 作为参数，并返回一个布尔值，表示该字符串是否为回文。回文是指正着读和反着读都一样的字符串。
 **要求：**
 - 函数应该忽略字符串中的空格、标点符号和大小写。
 - 只考虑字母和数字字符。
 * */

/*function isPalindrome(str) {
    const copy = str.toLowerCase().replace(/[^a-z0-9]/g, '')
    const strList = copy.split('').reverse()
    for (let i = 0; i < strList.length; i++) {
        if (strList[i] !== copy[i]) {
            return false
        }
    }
    return true
}*/

function isPalindrome(str) {
    const cleanedStr = str.toLowerCase().replace(/[^a-z0-9]/g, '');
    let left = 0;
    let right = cleanedStr.length - 1;
    
    while (left < right) {
        if (cleanedStr[left] !== cleanedStr[right]) {
            return false;
        }
        left++;
        right--;
    }
    
    return true;
}

function isPalindrome(str) {
    const cleanedStr = str.toLowerCase().replace(/[^a-z0-9]/g, '');
    const len = cleanedStr.length;
    
    return cleanedStr.split('').every((char, index) => {
        return char === cleanedStr[len - 1 - index];
    });
}

function isPalindrome(str) {
    const cleanedStr = str.toLowerCase().replace(/[^a-z0-9]/g, '');
    
    function checkPalindrome(s, start, end) {
        if (start >= end) {
            return true;
        }
        if (s[start] !== s[end]) {
            return false;
        }
        return checkPalindrome(s, start + 1, end - 1);
    }
    
    return checkPalindrome(cleanedStr, 0, cleanedStr.length - 1);
}

function isPalindrome(str) {
    const cleanedStr = str.toLowerCase().replace(/[^a-z0-9]/g, '');
    const len = cleanedStr.length;
    
    return cleanedStr.split('').reduce((acc, char, index) => {
        if (!acc) return false;
        return char === cleanedStr[len - 1 - index];
    }, true);
}

function isPalindrome(str) {
    const cleanedStr = str.toLowerCase().replace(/[^a-z0-9]/g, '');
    const reversedStr = cleanedStr.split('').reverse().join('');
    
    return cleanedStr.localeCompare(reversedStr) === 0;
}

console.log(isPalindrome("A man, a plan, a canal: Panama")); // true
console.log(isPalindrome("race a car")); // false
console.log(isPalindrome("No lemon, no melon")); // true
